今天繼續來談函式
在Scala裡有一級函式(Fisrt-class function) 的概念,即我們可以把函式定義成一個匿名常量(unnamed literal),並且把它當成值傳遞。
舉例來說:
val max = (x: Int, y: Int) => if (x > y) x else y
這是一個判斷大小的函式常量=>
左邊定義函式的參數和類型,右邊是函式的內容
函式常量(function literal)被編譯成類別,並在程式執行時實體化成函式值。
要區分函式常量和函式值在於前者存在於source code中,而後者以物件的形式存在與每次執行期間。
另外,
函式值是物件,所以可以把它們存在變數中。
函式值也是函式,所以也可以用一般呼叫函式那樣呼叫它們。
下面列出兩種函式值的操作:
var increment = (x: Int) => x + 10
increment(60) //Output = 70
val names = List("Maverick", "Goose", "rooster")
names.foreach((x: String) => println(x))
//Output =
//Maverick
//Goose
//rooster
再舉一個常見的例子,也就是filter
names.filter((x: String) => x.length > 7)
//Output = Maverick
以上面的例子為例,如果用簡寫形式來寫的話,我們知道Scala有型別推斷的功能,所以我們可以省略參數的類型不寫
names.filter((x) => x.length > 7)
另外如果是靠型別推斷而來的話,我們也可以省略參數的括號不寫
names.filter(x => x.length > 7)
為了讓函式常量的寫法更為精簡,我們也可以用底線(underscore)來表示一個或多個參數,只要這些參數在函式常量中只會出現一次即可。
舉例:
names.filter(_. > 7)
//List[String] = List("Maverick")
底線(underscore)在這邊就類似一個空格
函式每次呼叫時這個空格就會被填入一個引數
上面的例子是每次呼叫filter
時就會有個名字會被丟入到空格,來判斷它的長度有沒有大於7
今天先介紹到這邊 明天繼續